package es.javamyadmin.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collection;

import es.javamyadmin.beans.UsuarioBean;
import es.javamyadmin.modelo.Usuarios;

public class UsuariosDAO {
	
	Connection conexion = null;
	Statement estamento = null;
	PreparedStatement preparada = null;
	ResultSet resultado = null;
	
	
	/*METODO PARA USUARIOS DE MYSQL*/
	public Collection<Usuarios> leerUsuarios(String user, String pass, String host, String port, String clausulaWhere){
		Collection<Usuarios> lista = new ArrayList<Usuarios>();
			
		try {
			Class.forName("com.mysql.jdbc.Driver");
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/mysql", user, pass);
      	    
      	    String query = 	"SELECT "
      	    				+ " Host, User, Select_priv, Insert_priv, Update_priv, Delete_priv, Create_Priv,"
      	    				+ " Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv,"
      	    				+ " References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv,"
      	    				+ " Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv,"
      	    				+ " Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv,"
      	    				+ " Trigger_priv"
      	    				+ " FROM user "
      	    				+ 	clausulaWhere;
      	     
      	    PreparedStatement pstm = conexion.prepareStatement(query);
      	    resultado = pstm.executeQuery();
			while(resultado.next()){
				Usuarios usuarios = new Usuarios();
				usuarios.setUser(resultado.getString("User"));
				usuarios.setHost(resultado.getString("Host"));
				usuarios.setSelect_priv(resultado.getString("Select_priv"));
				usuarios.setInsert_priv(resultado.getString("Insert_priv"));
				usuarios.setUpdate_priv(resultado.getString("Update_priv"));
				usuarios.setDelete_priv(resultado.getString("Delete_priv"));
				usuarios.setCreate_priv(resultado.getString("Create_Priv"));
				usuarios.setDrop_priv(resultado.getString("Drop_priv"));
				usuarios.setReload_priv(resultado.getString("Reload_priv"));
				usuarios.setShutdown_priv(resultado.getString("Shutdown_priv"));
				usuarios.setProcess_priv(resultado.getString("Process_priv"));
				usuarios.setFile_priv(resultado.getString("File_priv"));
				usuarios.setGrant_priv(resultado.getString("Grant_priv"));
				usuarios.setReferences_priv(resultado.getString("References_priv"));
				usuarios.setIndex_priv(resultado.getString("Index_priv"));
				usuarios.setAlter_priv(resultado.getString("Alter_priv"));
				usuarios.setShow_db_priv(resultado.getString("Show_db_priv"));
				usuarios.setSuper_priv(resultado.getString("Super_priv"));
				usuarios.setCreate_tmp_table_priv(resultado.getString("Create_tmp_table_priv"));
				usuarios.setLock_tables_priv(resultado.getString("Lock_tables_priv"));
				usuarios.setExecute_priv(resultado.getString("Execute_priv"));
				usuarios.setRepl_slave_priv(resultado.getString("Repl_slave_priv"));
				usuarios.setRepl_client_priv(resultado.getString("Repl_client_priv"));
				usuarios.setCreate_view_priv(resultado.getString("Create_view_priv"));
				usuarios.setShow_view_priv(resultado.getString("Show_view_priv"));
				usuarios.setCreate_routine_priv(resultado.getString("Create_routine_priv"));
				usuarios.setAlter_routine_priv(resultado.getString("Alter_routine_priv"));
				usuarios.setCreate_user_priv(resultado.getString("Create_user_priv"));
				usuarios.setEvent_priv(resultado.getString("Event_priv"));
				usuarios.setTrigger_priv(resultado.getString("Trigger_priv"));
							
				lista.add(usuarios);				
			}
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
		} finally {
			cerrarConexion();
		}
		
		return lista;		
	}
	
	/*METODO PARA USUARIOS DE MYSQL*/
	public int editarUsuario(String user, String pass, String host, String port, UsuarioBean usuario){
		
		int codigoSQL = 0;
			
		try {
			Class.forName("com.mysql.jdbc.Driver");
      	    conexion=DriverManager.getConnection("jdbc:mysql://"+host+":"+port+"/mysql", user, pass);
      	    
      	    String update = 	"UPDATE user set "
      	    				+ 	" Select_priv=?, Insert_priv=?, Update_priv=?, Delete_priv=?, Create_Priv=?,"
      	    				+ 	" Drop_priv=?, Reload_priv=?, Shutdown_priv=?, Process_priv=?, File_priv=?, Grant_priv=?,"
      	    				+ 	" References_priv=?, Index_priv=?, Alter_priv=?, Show_db_priv=?, Super_priv=?, Create_tmp_table_priv=?,"
      	    				+ 	" Lock_tables_priv=?, Execute_priv=?, Repl_slave_priv=?, Repl_client_priv=?, Create_view_priv=?,"
      	    				+ 	" Show_view_priv=?, Create_routine_priv=?, Alter_routine_priv=?, Create_user_priv=?, Event_priv=?,"
      	    				+ 	" Trigger_priv=?"
      	    				+ 		" FROM user "
      	    				+ " WHERE User=? AND HOST=?";
      	     
      	    PreparedStatement pstm = conexion.prepareStatement(update);
      	    pstm.executeUpdate();
			
		} catch(SQLException | ClassNotFoundException ex){
			ex.printStackTrace();
			codigoSQL = ((SQLException) ex).getErrorCode();
		} finally {
			cerrarConexion();
		}
		
		return codigoSQL;
	}
	
	public void cerrarConexion(){
		if(resultado != null){
			try {
				resultado.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			resultado = null;
		}
		if(estamento != null){
			try {
				estamento.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			estamento = null;
		}
		if(preparada != null){
			try {
				preparada.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			preparada = null;
		}
		if(conexion != null){
			try {
				conexion.close();
			} catch(SQLException e){
				e.printStackTrace();
			}
			conexion = null;
		}
	}
		
}
